package org.example.util;

import lombok.extern.slf4j.Slf4j;
import org.example.entity.utilEntity.ListPage;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Slf4j
public class PageUtil {
    /**
     * 对List进行分页，返回传入类型的分页实体类，其中包含分页信息和子列表
     * @param list 要进行分页的List
     * @param page 当前第几页
     * @param pageSize 页面大小
     * @param <T> 泛型
     * @return 传入类型的泛型分页实体类
     */

    public static <T> ListPage<T> getListPaged(List<T> list, int page, int pageSize){
        ListPage<T> listPage =new ListPage();
        if (list == null || list.isEmpty()) {
            // 如果 dataList 为空，则直接返回空的 ListPage 对象
            return null;
        }
        int totalElements = list.size();  // 总元素数
        int totalPages = (int) Math.ceil((double) totalElements / pageSize);  // 总页数

        // 检查当前页是否大于最大页数，如果是，将当前页设置为最大页数
        if (page >= totalPages) {
            log.warn("page out of PageSize! page:{}, pageSize:{}",page,pageSize);
            page = totalPages - 1;
        }
        // 计算当前页的起始索引和结束索引
        int startIndex = page * pageSize;
        int endIndex = Math.min(startIndex + pageSize, totalElements);
        List<T> subList = list.subList(startIndex, endIndex);  // 当前页的子列表
        boolean hasNext = endIndex < totalElements;  // 是否有下一页

        listPage.setTotalPages(totalPages);  // 总页数
        listPage.setPageSize(pageSize);  // 页面大小
        listPage.setHasNext(hasNext);  // 是否有下一页
        listPage.setPage(page);  // 当前页
        listPage.setTotalElements(totalElements);  // 总元素数
        listPage.setSubList(subList);  // 子列表

        return listPage;
    }

    public static void main(String[] args) {
        // 示例用法
        List<Integer> list = new ArrayList<>();
//        list.add(1);


        int page = 4;
        int pageSize = 3;
        ListPage<Integer> listPage=PageUtil.getListPaged(list,page,pageSize);
//        System.out.println(listPage==null);
//        System.out.println(listPage.toString());
        Set<String> set=new HashSet<>();
        System.out.println(set.size());
    }
}
